package learn.stream;

import learn.baidu.OnlyWord;
import cn.hutool.core.util.StrUtil;

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.stream.Collectors.*;

/**
 * Created By  醉美柳舞之众星捧月
 *
 * @author songx
 * @date 2019/5/18 23:08
 */
public class LengLeng {

    public static void main(String[] args) {

        /** 集合 **/
        ArrayList<OnlyWord> words = new ArrayList<>();
        Stream<OnlyWord> onlyWord = words.stream();

        /** 数组 **/
        String[] name = {"abc", "123", "456"};
        Stream<String> stringStream = Arrays.stream(name);

        /** 值 **/
        Stream<String> streamadd = Stream.of("123", "456", "789");

        /** 文件 ;  try-with-resources**/
        try {
            Files.lines(Paths.get("文件的路径"), Charset.defaultCharset());
        } catch (Exception e) {

        }

        /** iterator **/
        Stream.iterate(1, n -> n + 2).limit(10).forEach(System.out::println);

        /** 过滤 **/
        List<OnlyWord> collect = onlyWord.filter(i -> StrUtil.isNotBlank(i.getWord())).collect(Collectors.toList());

        /** 去掉重复 **/
        List<OnlyWord> collect1 = onlyWord.distinct().collect(Collectors.toList());

        /** 截取流的前N个元素 **/
        List<OnlyWord> collect2 = onlyWord.limit(3).collect(Collectors.toList());

        /** 跳过流的前n个元素 **/
        List<OnlyWord> collect3 = onlyWord.skip(3).collect(Collectors.toList());

        /** 映射; 获取每个对象中的word **/
        List<String> collect4 = onlyWord.map(OnlyWord::getWord).collect(Collectors.toList());

        /** 合并流....很麻烦... **/

        /** anyMatch **/

        /** allMatch **/

        /** noneMatch **/

        /** findAny **/
        Optional<OnlyWord> any = onlyWord.findAny();

        /** findFirst **/
        Optional<OnlyWord> first = onlyWord.findFirst();

        /** 计算流中的元素的个数 **/
        onlyWord.collect(counting());

        /** 对流中项目的一个整数属性求和 **/
        onlyWord.collect(summingInt(OnlyWord::getId));

        /** 收集关于流中项目 Integer 属性的统计值，例如最大、最小、 总和与平均值 **/
        IntSummaryStatistics collect5 = onlyWord.collect(summarizingInt(OnlyWord::getId));

        /** 连接对流中每个项目调用 toString 方法所生成的字符串 **/
        String collect6 = onlyWord.map(OnlyWord::getWord_name).collect(joining());

        /** 按照给定比较器选出的最大元素的 Optional， 或如果流为空则为 Optional.empty() **/
        Optional<OnlyWord> collect7 = onlyWord.collect(maxBy(Comparator.comparing(OnlyWord::getId)));

        /** 从一个作为累加器的初始值开始，利用 BinaryOperator 与流中的元素逐个结合，从而将流归约为单个值 **/
        int totalStars = onlyWord.collect(reducing(0, OnlyWord::getId, Integer::sum));

        /** 包含另一个收集器，对其结果应用转换函数 **/
        int howManyProjects = onlyWord.collect(collectingAndThen(toList(), List::size));

/** 数据分区还是很重要的 **/

        /** 根据项目的一个属性的值对流中的项目作问组，并将属性值作 为结果 Map 的键 **/
        Map<String, List<OnlyWord>> projectByLanguage = onlyWord.collect(groupingBy(OnlyWord::getWord_name));

        /** 根据对流中每个项目应用断言的结果来对项目进行分区;true一组、false一组;所以最多只有两组 **/
        Map<Boolean, List<OnlyWord>> vegetarianDishes = onlyWord.collect(partitioningBy(OnlyWord::getDisplay));


        TreeSet<OnlyWord> collect8 = onlyWord.collect(toCollection(TreeSet::new));
    }
}
